package com.example.salesystem.controller;


import com.example.salesystem.common.AppVar;
import com.example.salesystem.common.ResultAjax;
import com.example.salesystem.common.SessionUtils;
import com.example.salesystem.model.User;
import com.example.salesystem.service.IUserService;
import com.sun.istack.internal.NotNull;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.time.LocalDateTime;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author lishuo
 * @since 2024-05-18
 */
@Api(tags = "用户接口")
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private IUserService userService;

    /**
     * 用户注册
     * @param username
     * @param password
     * @param passwordRepeat
     * @return
     */
    @ApiOperation("用户注册")
    @PostMapping("/reg")
    public ResultAjax reg(@ApiParam("用户名") @RequestParam("username") @NotNull String username,
                          @ApiParam("密码") @RequestParam("password") @NotNull String password,
                          @ApiParam("确认密码") @RequestParam("passwordRepeat") @NotNull String passwordRepeat) {
        // 0.校验重复密码是否一致
        if (!password.equals(passwordRepeat)) {
            // 打印日志
            log.warn("两次输入密码不一致");
            // 返回错信息
            return ResultAjax.fail("参数校验失败!");
        }
        // 1.准备数据
        // 1.1 加盐加密 TODO
        // 1.2 封装数据
        User user = new User();
        user.setUsername(username);
        user.setAccount(username);
        user.setPassword(password);
        user.setRole("normal");
        user.setPhoto("image/touxiang.jpg"); // 设置默认头像
        user.setCreateTime(LocalDateTime.now());
        user.setUpdateTime(LocalDateTime.now());
        // 2. 调用 service, 执行注册逻辑
        boolean save = userService.save(user);
        // 3.返回结果
        return ResultAjax.succ();
    }

    /**
     * 用户登录
     * @param username
     * @param password
     * @param request
     * @return
     */
    @ApiOperation("用户登录")
    @PostMapping("/login")
    public ResultAjax login(@ApiParam("用户名") @RequestParam("username") @NotNull String username,
                            @ApiParam("密码") @RequestParam("password") @NotNull String password,
                            HttpServletRequest request) {
        // 1. 调用 service 执行登录逻辑
        User user = userService.login(username, password);
        if (user == null) {
            // 打印日志
            log.warn("登录失败");
            // 返回错信息
            return ResultAjax.fail("登录失败!");
        }
        // 2. 存储 session
        HttpSession session = request.getSession();
        session.setAttribute(AppVar.SESSION_USERINFO_KEY,user);
        // 3. 返回结果
        return ResultAjax.succ();
    }

    /**
     * 退出登录
     * @param request 请求
     * @return
     */
    @ApiOperation("退出登录")
    @GetMapping("/logout")
    public ResultAjax logout (HttpServletRequest request) {
        // 1.获取session对象
        HttpSession session = request.getSession(false);
        // 2.检查session是否有效
        if (session != null) {
            // 登录状态下退出，打印日志
            session.invalidate();
            log.info("用户退出成功!");
        }
        // 返回成功响应
        return ResultAjax.succ();
    }

    /**
     * 获取用户信息
     * @param request
     * @return
     */
    @ApiOperation("获取用户信息")
    @GetMapping("/info")
    public ResultAjax<User> getUserInfo (HttpServletRequest request) {
        // 1. 从 Session 中获取当前登录用户信息
        User user = SessionUtils.getUser(request);
        if (user == null) {
            // 打印日志
            log.warn("用户信息获取失败");
            // 返回错信息
            return ResultAjax.fail("用户信息获取失败!");
        }
        // 2. 返回结果
        return ResultAjax.succ(user);
    }

    /**
     * 修改个人信息
     * @param request
     * @param username
     * @param email
     * @param phone
     * @param address
     * @return
     */
    @ApiOperation("修改个人信息")
    @PostMapping("/modefyInfo")
    public ResultAjax<User> modifyInfo(HttpServletRequest request,
                                       @ApiParam("昵称") @RequestParam(value = "username",required = false) String username,
                                       @ApiParam("邮箱") @RequestParam(value = "email",required = false) String email,
                                       @ApiParam("手机号") @RequestParam(value = "phone",required = false) String phone,
                                       @ApiParam("收件地址") @RequestParam(value = "address",required = false) String address) {
        // 1. 校验参数（不都为空）
        if (username == null && email == null && phone == null && address == null) {
            // 打印日志
            log.warn("参数校验失败");
            // 返回错信息
            return ResultAjax.fail("参数校验失败!");
        }
        // 2. 封装对象
        // 2.1 获取 session 中对象信息
        User user = SessionUtils.getUser(request);
        // 2.2 封装
        User updateUser = new User();
        updateUser.setId(user.getId());
        updateUser.setUsername(username);
        updateUser.setEmail(email);
        updateUser.setPhone(phone);
        updateUser.setAddress(address);
        // 2. 调用 service
        User newUser = userService.modefyInfo(updateUser);
        // 3. 更新 session 信息
        HttpSession session = request.getSession();
        session.setAttribute(AppVar.SESSION_USERINFO_KEY,newUser);
        // 4. 返回结果
        return ResultAjax.succ();
    }

    @ApiOperation("修改密码")
    @PostMapping("/modefyPwd")
    public ResultAjax modifyPassword (HttpServletRequest request,
                                      @ApiParam("原密码") @RequestParam("oldPassword") @NotNull String oldPassword,
                                      @ApiParam("新密码") @RequestParam("newPassword") @NotNull String newPassword,
                                      @ApiParam("确认密码") @RequestParam("passwordRepeat") @NotNull String passwordRepeat) {
        // 1.校验重复密码是否一致
        if (!newPassword.equals(passwordRepeat)) {
            // 打印日志
            log.warn("两次输入密码不一致");
            // 返回错信息
            return ResultAjax.fail("参数校验失败!");
        }
        // 2. 校验原密码和新密码是否一致
        if (oldPassword.equals(newPassword)) {
            // 打印日志
            log.warn("新老密码一致");
            // 返回错信息
            return ResultAjax.fail("新老密码一致");
        }
        // 3. 调用 service
        User oldUser = SessionUtils.getUser(request);
        userService.modefyPwd(oldPassword,newPassword,oldUser);
        // 4. 销毁 session （重新登录）
        HttpSession session = request.getSession(false);
        // 2.检查session是否有效
        if (session != null) {
            // 登录状态下退出，打印日志
            session.invalidate();
            log.info("用户退出成功!");
        }
        // 返回成功响应
        return ResultAjax.succ();
    }


}
